home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / shells / rc-1.000 / rc-1 / rc-1.5-linux / rc.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-07  |  8.8 KB  |  379 lines

  1. #include "config.h"
  2. #include "proto.h"
  3.  
  4. /* datatypes */
  5.  
  6. /* braindamaged IBM header files #define true and false */
  7. #undef FALSE
  8. #undef TRUE
  9.  
  10. #include <stdarg.h>
  11.  
  12. typedef void builtin_t(char **);
  13. typedef struct Block Block;
  14. typedef struct Dup Dup;
  15. typedef struct Estack Estack;
  16. typedef struct Function Function;
  17. typedef struct Hq Hq;
  18. typedef struct Htab Htab;
  19. typedef struct Jbwrap Jbwrap;
  20. typedef struct List List;
  21. typedef struct Node Node;
  22. typedef struct Pipe Pipe;
  23. typedef struct Redir Redir;
  24. typedef struct Rq Rq;
  25. typedef struct Variable Variable;
  26. typedef struct Word Word;
  27. typedef struct Format Format;
  28. typedef union Edata Edata;
  29.  
  30. typedef enum nodetype {
  31.     nAndalso, nAssign, nBackq, nBang, nBody, nCbody, nNowait, nBrace, nConcat,
  32.     nCount, nElse, nFlat, nDup, nEpilog, nNewfn, nForin, nIf, nQword,
  33.     nOrelse, nPipe, nPre, nRedir, nRmfn, nArgs, nSubshell, nCase,
  34.     nSwitch, nMatch, nVar, nVarsub, nWhile, nWord, nLappend, nNmpipe
  35. } nodetype;
  36.  
  37. typedef enum ecodes {
  38.     eError, eBreak, eReturn, eVarstack, eArena, eFifo, eFd
  39. } ecodes;
  40.  
  41. typedef enum bool {
  42.     FALSE, TRUE
  43. } bool;
  44.  
  45. typedef enum inputtype {
  46.     iFd, iString
  47. } inputtype;
  48.  
  49. typedef enum redirtype {
  50.     rFrom, rCreate, rAppend, rHeredoc, rHerestring
  51. } redirtype;
  52.  
  53. typedef bool (*Conv)(Format *, int);
  54.  
  55. union Edata {
  56.     Jbwrap *jb;
  57.     Block *b;
  58.     char *name;
  59.     int fd;
  60. };
  61.  
  62. struct Estack {
  63.     ecodes e;
  64.     bool interactive;
  65.     Edata data;
  66.     Estack *prev;
  67. };
  68.  
  69. struct List {
  70.     char *w, *m;
  71.     List *n;
  72. };
  73.  
  74. struct Node {
  75.     nodetype type;
  76.     union {
  77.         char *s;
  78.         int i;
  79.         Node *p;
  80.     } u[4];
  81. };
  82.  
  83. struct Pipe {
  84.     int left, right;
  85. };
  86.  
  87. struct Dup {
  88.     redirtype type;
  89.     int left, right;
  90. };
  91.  
  92. struct Redir {
  93.     redirtype type;
  94.     int fd;
  95. };
  96.  
  97. struct Word {
  98.     char *w, *m;
  99. };
  100.  
  101. struct Rq {
  102.     Node *r;
  103.     struct Rq *n;
  104. };
  105.  
  106. struct Function {
  107.     Node *def;
  108.     char *extdef;
  109. };
  110.  
  111. struct Variable {
  112.     List *def;
  113.     char *extdef;
  114.     Variable *n;
  115. };
  116.  
  117. struct Htab {
  118.     char *name;
  119.     void *p;
  120. };
  121.  
  122. struct Format {
  123.     /* for the formatting routines */
  124.     va_list args;
  125.     long flags, f1, f2;
  126.     /* for the buffer maintainence routines */
  127.     char *buf, *bufbegin, *bufend;
  128.     int flushed;
  129.     void (*grow)(Format *, SIZE_T);
  130.     union { int n; void *p; } u;
  131. };
  132.  
  133. /* Format->flags values */
  134. enum {
  135.     FMT_long    = 1,        /* %l */
  136.     FMT_short    = 2,        /* %h */
  137.     FMT_unsigned    = 4,        /* %u */
  138.     FMT_zeropad    = 8,        /* %0 */
  139.     FMT_leftside    = 16,        /* %- */
  140.     FMT_altform    = 32,        /* %# */
  141.     FMT_f1set    = 64,        /* %<n> */
  142.     FMT_f2set    = 128        /* %.<n> */
  143. };
  144.  
  145. /* macros */
  146. #define EOF (-1)
  147. #ifndef NULL
  148. #define NULL 0
  149. #endif
  150. #define a2u(x) n2u(x, 10)
  151. #define o2u(x) n2u(x, 8)
  152. #define arraysize(a) ((int)(sizeof(a)/sizeof(*a)))
  153. #define memzero(s, n) memset(s, 0, n)
  154. #define enew(x) ((x *) ealloc(sizeof(x)))
  155. #define ecpy(x) strcpy((char *) ealloc(strlen(x) + 1), x)
  156. #define lookup_fn(s) ((Function *) lookup(s, fp))
  157. #define lookup_var(s) ((Variable *) lookup(s, vp))
  158. #define nnew(x) ((x *) nalloc(sizeof(x)))
  159. #define ncpy(x) (strcpy((char *) nalloc(strlen(x) + 1), x))
  160. #ifndef offsetof
  161. #define offsetof(t, m) ((SIZE_T) (((char *) &((t *) 0)->m) - (char *)0))
  162. #endif
  163. #define streq(x, y) (*(x) == *(y) && strcmp(x, y) == 0)
  164. #define conststrlen(x) (sizeof (x) - 1)
  165.  
  166. /* rc prototypes */
  167.  
  168. /* main.c */
  169. extern char *prompt, *prompt2;
  170. extern Rq *redirq;
  171. extern bool dashdee, dashee, dashvee, dashex, dashell,
  172.     dasheye, dashen, dashpee, interactive;
  173. extern int rc_pid;
  174. extern int lineno;
  175.  
  176. /* builtins.c */
  177. extern builtin_t *isbuiltin(char *);
  178. extern void b_exec(char **), funcall(char **), b_dot(char **), b_builtin(char **);
  179. extern char *which(char *, bool);
  180.  
  181. /* except.c */
  182. extern bool nl_on_intr;
  183. extern bool outstanding_cmdarg(void);
  184. extern void pop_cmdarg(bool);
  185. extern void rc_raise(ecodes);
  186. extern void except(ecodes, Edata, Estack *);
  187. extern void unexcept(void);
  188. extern void rc_error(char *);
  189. extern void sigint(int);
  190.  
  191. /* exec.c */
  192. extern void exec(List *, bool);
  193. extern void doredirs(void);
  194.  
  195. /* footobar.c */
  196. extern char **list2array(List *, bool);
  197. extern char *get_name(char *);
  198. extern List *parse_var(char *, char *);
  199. extern Node *parse_fn(char *, char *);
  200. extern void initprint(void);
  201. extern void rc_exit(int); /* here for odd reasons; user-defined signal handlers are kept in fn.c */
  202.  
  203. /* getopt.c */
  204. extern int rc_getopt(int, char **, char *);
  205.  
  206. extern int rc_optind, rc_opterr, rc_optopt;
  207. extern char *rc_optarg;
  208.  
  209. /* glob.c */
  210. extern bool lmatch(List *, List *);
  211. extern List *glob(List *);
  212.  
  213. /* glom.c */
  214. extern void assign(List *, List *, bool);
  215. extern void qredir(Node *);
  216. extern List *append(List *, List*);
  217. extern List *flatten(List *);
  218. extern List *glom(Node *);
  219. extern List *concat(List *, List *);
  220. extern List *varsub(List *, List *);
  221. extern List *word(char *, char *);
  222.  
  223. /* hash.c */
  224. extern Htab *fp, *vp;
  225. extern void *lookup(char *, Htab *);
  226. extern Function *get_fn_place(char *);
  227. extern List *varlookup(char *);
  228. extern Node *fnlookup(char *);
  229. extern Variable *get_var_place(char *, bool);
  230. extern bool varassign_string(char *);
  231. extern char **makeenv(void);
  232. extern char *fnlookup_string(char *);
  233. extern char *varlookup_string(char *);
  234. extern void alias(char *, List *, bool);
  235. extern void starassign(char *, char **, bool);
  236. extern void delete_fn(char *);
  237. extern void delete_var(char *, bool);
  238. extern void fnassign(char *, Node *);
  239. extern void fnassign_string(char *);
  240. extern void fnrm(char *);
  241. extern void initenv(char **);
  242. extern void inithash(void);
  243. extern void setsigdefaults(bool);
  244. extern void inithandler(void);
  245. extern void varassign(char *, List *, bool);
  246. extern void varrm(char *, bool);
  247. extern void whatare_all_vars(bool, bool);
  248. extern void whatare_all_signals(void);
  249. extern void prettyprint_var(int, char *, List *);
  250. extern void prettyprint_fn(int, char *, Node *);
  251.  
  252. /* heredoc.c */
  253. extern int heredoc(int);
  254. extern int qdoc(Node *, Node *);
  255. extern Hq *hq;
  256.  
  257. /* input.c */
  258. extern void initinput(void);
  259. extern Node *parseline(char *);
  260. extern int gchar(void);
  261. extern void ugchar(int);
  262. extern Node *doit(bool);
  263. extern void flushu(void);
  264. extern void pushfd(int);
  265. extern void pushstring(char **, bool);
  266. extern void popinput(void);
  267. extern void closefds(void);
  268. extern int last;
  269. extern bool rcrc;
  270.  
  271. /* lex.c */
  272. extern int yylex(void);
  273. extern void inityy(void);
  274. extern void yyerror(const char *);
  275. extern void scanerror(char *);
  276. extern void print_prompt2(void);
  277. extern const char nw[], dnw[];
  278.  
  279. /* list.c */
  280. extern void listfree(List *);
  281. extern List *listcpy(List *, void *(*)(SIZE_T));
  282. extern SIZE_T listlen(List *);
  283. extern int listnel(List *);
  284.  
  285. /* match.c */
  286. extern bool match(char *, char *, char *);
  287.  
  288. /* alloc.c */
  289. extern void *ealloc(SIZE_T);
  290. extern void *erealloc(void *, SIZE_T);
  291. extern void efree(void *);
  292. extern Block *newblock(void);
  293. extern void *nalloc(SIZE_T);
  294. extern void nfree(void);
  295. extern void restoreblock(Block *);
  296.  
  297. /* open.c */
  298. extern int rc_open(const char *, redirtype);
  299.  
  300. /* print.c */
  301. /*
  302.    The following prototype should be:
  303. extern Conv fmtinstall(int, Conv);
  304.    but this freaks out SGI's compiler under IRIX3.3.2
  305. */
  306. extern bool (*fmtinstall(int, bool (*)(Format *, int)))(Format *, int);
  307. extern int printfmt(Format *, const char *);
  308. extern int fmtprint(Format *, const char *,...);
  309. extern void fmtappend(Format *, const char *, SIZE_T);
  310. extern void fmtcat(Format *, const char *);
  311. extern int fprint(int fd, const char *fmt,...);
  312. extern char *mprint(const char *fmt,...);
  313. extern char *nprint(const char *fmt,...);
  314. /*
  315.    the following macro should by rights be coded as an expression, not
  316.    a statement, but certain compilers (notably DEC) have trouble with
  317.    void expressions inside the ?: operator. (sheesh, give me a break!)
  318. */
  319. #define    fmtputc(f, c) {\
  320.     if ((f)->buf >= (f)->bufend)\
  321.         (*(f)->grow)((f), (SIZE_T)1);\
  322.     *(f)->buf++ = (c);\
  323. }
  324.  
  325. /* y.tab.c (parse.y) */
  326. extern Node *parsetree;
  327. extern int yyparse(void);
  328. extern void initparse(void);
  329.  
  330. /* redir.c */
  331. extern void doredirs(void);
  332.  
  333. /* signal.c */
  334. extern void initsignal(void);
  335. extern void catcher(int);
  336. extern void sigchk(void);
  337. extern void (*rc_signal(int, void (*)(int)))(int);
  338. extern void (*sighandlers[])(int);
  339. extern volatile SIG_ATOMIC_T slow, interrupt_happened;
  340.  
  341. /* status.c */
  342. extern int istrue(void);
  343. extern int getstatus(void);
  344. extern void set(bool);
  345. extern void setstatus(int, int);
  346. extern List *sgetstatus(void);
  347. extern void setpipestatus(int [], int);
  348. extern void statprint(int, int);
  349. extern void ssetstatus(char **);
  350. extern char *strstatus(int s);
  351.  
  352. /* tree.c */
  353. extern Node *mk(int /*nodetype*/,...);
  354. extern Node *treecpy(Node *, void *(*)(SIZE_T));
  355. extern void treefree(Node *);
  356.  
  357. /* utils.c */
  358. extern bool isabsolute(char *);
  359. extern int n2u(char *, unsigned int);
  360. extern int rc_read(int, char *, SIZE_T);
  361. extern int mvfd(int, int);
  362. extern int starstrcmp(const void *, const void *);
  363. extern void pr_error(char *);
  364. extern void panic(char *);
  365. extern void uerror(char *);
  366. extern void writeall(int, char *, SIZE_T);
  367.  
  368. /* wait.c */
  369. extern int rc_fork(void);
  370. extern int rc_wait4(int, int *, bool);
  371. extern List *sgetapids(void);
  372. extern void waitforall(void);
  373. extern bool forked;
  374.  
  375. /* walk.c */
  376. extern bool walk(Node *, bool);
  377. extern bool cond;
  378.  
  379.